package main

/**
临界资源的安全问题

同一份资源由多个子协程访问, 可能会造成错误
*/

import (
	"fmt"
	"math/rand"
	"time"
)

// 全局定定义票的数量
var ticket = 10

func main() {

	go saleTicket("窗口1")
	go saleTicket("窗口2")
	go saleTicket("窗口3")
	go saleTicket("窗口4")

	time.Sleep(5 * time.Second)
}

/**
窗口买票函数
name 窗口名字
*/
func saleTicket(name string) {
	// 设置随机睡眠时间
	rand.Seed(time.Now().UnixNano())
	for {
		if ticket > 0 {
			time.Sleep(time.Duration(rand.Intn(1000)) * time.Millisecond)
			fmt.Println(name, "当前余票数量: ", ticket)
			ticket--
		} else {
			fmt.Println(name, "售罄, 没有票了..")
			break
		}
	}
}
